package com.springboot.frame.starter.web.access;

import com.springboot.fram.core.cache.CacheTemplate;
import com.springboot.frame.starter.web.exception.ResultEnumException;
import com.springboot.frame.swagger.GlobalResultEnum;
import org.springframework.util.StringUtils;

import java.util.UUID;

/**
 * @author liheng
 * @ClassName AccessToken
 * @Description
 * @date 2021-01-02 20:17
 */
public class AccessToken {
    private CacheTemplate accessTokenCache;
    private CacheTemplate refreshTokenCache;
    private long tokenExpireTime;

    public AccessToken(CacheTemplate accessTokenCache, long tokenExpireTime, CacheTemplate refreshTokenCache) {
        this.accessTokenCache = accessTokenCache;
        this.tokenExpireTime = tokenExpireTime;
        this.refreshTokenCache = refreshTokenCache;
    }

    /**
     * 保存令牌
     *
     * @param account  更换令牌，防止多地登陆
     * @param userInfo
     * @param <T>
     * @return
     */
    public <T> AccessTokenVO savaToken(String account, T userInfo) {
        AccessTokenVO vo = new AccessTokenVO();
        String token = UUID.randomUUID().toString();
        // 保存token令牌
        accessTokenCache.setKey("token:" + account, token);
        String reftoken = UUID.randomUUID().toString();
        // 保存刷新令牌
        refreshTokenCache.setKey("ref-token:" + account, reftoken);
        vo.setUserInfo(userInfo);
        vo.setToken(token);
        vo.setRefreshToken(reftoken);
        vo.setExpiresIn(this.tokenExpireTime);
        return vo;
    }


    /**
     * 刷新令牌
     *
     * @param account
     * @param userInfo
     * @param <T>
     * @return
     */
    public <T> AccessTokenVO refreshToken(String account, T userInfo) {
        AccessTokenVO vo = new AccessTokenVO();
        String token = UUID.randomUUID().toString();
        // 保存token令牌
        accessTokenCache.setKey("token:" + account, token);
        // 保存刷新令牌
        String refreshToken = (String) refreshTokenCache.getKey("ref-token:" + account);
        if (!StringUtils.hasLength(refreshToken)) {
            throw new ResultEnumException(GlobalResultEnum.REF_TOKEN_EXPIRE);
        }
        vo.setUserInfo(userInfo);
        vo.setToken(token);
        vo.setRefreshToken(refreshToken);
        vo.setExpiresIn(this.tokenExpireTime);
        return vo;
    }
}
